# LinuxMonitoring v2.0

Мониторинг и исследование состояния системы в реальном времени.


## Contents

1. [Chapter I](#chapter-i) 
2. [Chapter II](#chapter-ii) \
    2.1. [GoAccess](#goaccess) \
    2.2. [Prometheus](#prometheus) \
    2.3. [Grafana](#grafana)
3. [Chapter III](#chapter-iii) \
    3.1. [Генератор файлов](#part-1-генератор-файлов)  
    3.2. [Засорение файловой системы](#part-2-засорение-файловой-системы)  
    3.3. [Очистка файловой системы](#part-3-очистка-файловой-системы)  
    3.4. [Генератор логов](#part-4-генератор-логов)  
    3.5. [Мониторинг](#part-5-мониторинг)  
    3.6. [GoAccess](#part-6-goaccess)  
    3.7. [Prometheus и Grafana](#part-7-prometheus-и-grafana)  
    3.8. [Готовый дашборд](#part-8-готовый-дашборд)  
    3.9. [Дополнительно. Свой node_exporter](#part-9-дополнительно-свой-node_exporter)  


## Chapter I

![linux_monitoringv2.0](misc/images/linux_monitoringv2.0.png)

Планета Земля, США, штат Калифорния, наши дни.

Уже в самом начале рабочего дня Джона вызывали к начальству.
Там ему сообщили, что его приятель Себ уже 4-ый день не приходит на работу и есть риск что его задание не будет завершено в срок.
В связи с этим, ему поручают разобраться с мониторингом в Линуксе, чтобы в случае необходимости подменить нерадивого товарища.

Джон зашел в кабинет Себа, сел за его компьютер и сразу открыл подозрительно недлинный файл с заметками.
К сожалению, во время изучения той информации, что собрал Себ, Джон никак не мог прекратить думать о вкуснейшем обеде, который он оставил себе в комнате отдыха...


## Chapter II

### **GoAccess**

GoAccess - это анализатор логов, который может работать с ними в реальном времени, визуализировать информацию и отдавать ее через терминал или через браузер в виде веб-странички. 

### **Prometheus**

Базы данных временных рядов, как следует из их названия, представляют собой системы баз данных,
специально разработанные для обработки данных, связанных со временем.

Большинство систем использует реляционные базы данных, основанные на таблицах. 
Базы данных временных рядов работают по-другому.
Данные по-прежнему хранятся в "коллекциях", но эти коллекции имеют общий знаменатель: они агрегируются с течением времени.
По сути, это означает, что для каждой точки, которую можно сохранить, есть связанная с ней метка времени.

Prometheus — это база данных временных рядов, к которой можно присоединить целую экосистему инструментов, чтобы расширить ее функционал. \
Prometheus создан, чтобы мониторить самые разные системы: серверы, базы данных, отдельные виртуальные машины, да почти что угодно.

### **Grafana**

Grafana — платформа для визуализации, мониторинга и анализа данных.
Grafana позволяет пользователям создавать *дашборды* с *панелями*, каждая из которых отображает определенные показатели в течение установленного периода времени.
Каждый *дашборд* универсален, поэтому его можно настроить для конкретного проекта.

*Панель* — базовый элемент визуализации выбранных показателей.

*Дашборд* — набор отдельных панелей, размещенных в сетке с набором переменных (например, имя сервера, приложения и т.д.).


## Chapter III

- Написанные Bash-скрипты должны находиться в папке src
- Для каждого задания должна быть создана папка с названием вида: **0x**, где x - номер задания
- Все скрипты должны быть декомпозированы и разбиты на несколько файлов
- Файл с основным сценарием для каждого задания должен называться **main.sh**
- Во всех скриптах должны быть предусмотрены проверки на некорректный ввод (указаны не все параметры, параметры неправильного формата и т.д.)
- Все написанные скрипты нужно запускать на виртуальной машине *Ubuntu Server 20.04 LTS*


## Part 1. Генератор файлов

После непродолжительного изучения найденной на компьютере Себа информации Джон зашел в комнату отдыха и обнаружил, что Майк забрал его прекрасный сэндвич, который он специально принес из дома.

Нельзя это просто так оставлять, Джон теперь обязан подшутить над ним в ответ, проучив его.

Заодно можно будет лишний раз попрактиковаться в работе с файлами в bash-скриптах. Как раз может быть полезно при подготовке тестового окружения для настройки задач мониторинга.

**== Задание ==**

Написать bash-скрипт. Скрипт запускается с 6 параметрами. Пример запуска скрипта: \
`main.sh /opt/test 4 az 5 az.az 3kb` 

**Параметр 1** - это абсолютный путь. \
**Параметр 2** - количество вложенных папок. \
**Параметр 3** - список букв английского алфавита, используемый в названии папок (не более 7 знаков). \
**Параметр 4** - количество файлов в каждой созданной папке. \
**Параметр 5** - список букв английского алфавита, используемый в имени файла и расширении (не более 7 знаков для имени, не более 3 знаков для расширения). \
**Параметр 6** - размер файлов (в килобайтах, но не более 100).  

Имена папок и файлов должны состоять только из букв, указанных в параметрах, и использовать каждую из них хотя бы 1 раз.  
Длина этой части имени должна быть от 4 знаков, плюс дата запуска скрипта в формате DDMMYY, отделённая нижним подчёркиванием, например: \
**./aaaz_021121/**, **./aaazzzz_021121** 

При этом, если для имени папок или файлов были заданы символы `az`, то в названии файлов или папок не может быть обратной записи: \
**./zaaa_021121/**, т.е. порядок указанных символов в параметре должен сохраняться.

При запуске скрипта в указанном в параметре 1 месте, должны быть созданы папки и файлы в них с соответствующими именами и размером.  
Скрипт должен остановить работу, если в файловой системе (в разделе /) останется 1 Гб свободного места.  
Записать лог файл с данными по всем созданным папкам и файлам (полный путь, дата создания, размер для файлов).


## Part 2. Засорение файловой системы

А теперь пришло время показать Майку на что способен человек, которого лишили сэндвича.

**== Задание ==**

Написать bash-скрипт. Скрипт запускается с 3 параметрами. Пример запуска скрипта: \
`main.sh az az.az 3Mb`

**Параметр 1** - список букв английского алфавита, используемый в названии папок (не более 7 знаков). \
**Параметр 2** - список букв английского алфавита, используемый в имени файла и расширении (не более 7 знаков для имени, не более 3 знаков для расширения). \
**Параметр 3** - размер файла (в Мегабайтах, но не более 100).  

Имена папок и файлов должны состоять только из букв, указанных в параметрах, и использовать каждую из них хотя бы 1 раз.  
Длина этой части имени должна быть от 5 знаков, плюс дата запуска скрипта в формате DDMMYY, отделённая нижним подчёркиванием, например: \
**./aaazz_021121/**, **./aaazzzz_021121** 

При этом, если для имени папок или файлов были заданы символы `az`, то в названии файлов или папок не может быть обратной записи: \
**./zaaa_021121/**, т.е. порядок указанных в параметре символов должен сохраняться.

При запуске скрипта, в различных (любых, кроме путей содержащих **bin** или **sbin**) местах файловой системы, должны быть созданы папки с файлами.
Количество вложенных папок - до 100. Количество файлов в каждой папке - случайное число (для каждой папки своё).  
Скрипт должен остановить работу, когда в файловой системе (в разделе /) останется 1 Гб свободного места.  
Свободное место в файловой системе определять командой: `df -h /`  

Записать лог файл с данными по всем созданным папкам и файлам (полный путь, дата создания, размер для файлов).  
В конце работы скрипта, вывести на экран время начало работы скрипта, время окончания и общее время его работы. Дополнить этими данными лог файл.


## Part 3. Очистка файловой системы

Проклятье! Джон запустил скрипт не на том компьютере. Теперь ему срочно нужно написать скрипт, который всё исправит...

**== Задание ==**

Написать bash-скрипт. Скрипт запускается с 1 параметром.
Скрипт должен уметь очистить систему от созданных в [Part 2](#part-2-засорение-файловой-системы) папок и файлов 3 способами:

1. По лог файлу
2. По дате и времени создания
3. По маске имени (т.е. символы, нижнее подчёркивание и дата).  

Способ очистки задается при запуске скрипта, как параметр со значением 1, 2 или 3.

*При удалении по дате и времени создания, пользователем вводятся времена начала и конца с точностью до минуты. Удаляются все файлы, созданные в указанном временном промежутке. Ввод может быть реализован как через параметры, так и во время выполнения программы.*


## Part 4. Генератор логов

Джон наконец закончил со своими делами и готов продолжать разбираться с мониторингом.

Для начала было бы неплохо создать логи, которые можно будет анализировать.

**== Задание ==**

Написать bash-скрипт или программу на Си, генерирующий 5 файлов логов **nginx** в *combined* формате.
Каждый лог должен содержать информацию за 1 день.

За день должно быть сгенерировано случайное число записей от 100 до 1000.
Для каждой записи должны случайным образом генерироваться:

1. IP (любые корректные, т.е. не должно быть ip вида 999.111.777.777)
2. Коды ответа (200, 201, 400, 401, 403, 404, 500, 501, 502, 503)
3. Методы (GET, POST, PUT, PATCH, DELETE)
4. Даты (в рамках заданного дня лога, должны идти по увеличению)
5. URL запроса агента
6. Агенты (Mozilla, Google Chrome, Opera, Safari, Internet Explorer, Microsoft Edge, Crawler and bot, Library and net tool)

В комментариях в вашем скрипте/программе указать, что означает каждый из использованных кодов ответа.


## Part 5. Мониторинг

Теперь, когда у Джона есть файлы для анализа, он может приступить непосредственно к мониторингу.

**== Задание ==**

Написать bash-скрипт для разбора логов **nginx** из [Части 4](#part-4-генератор-логов) через **awk**.

Скрипт запускается с 1 параметром, который принимает значение 1, 2, 3 или 4.
В зависимости от значения параметра вывести:

1. Все записи, отсортированные по коду ответа
2. Все уникальные IP, встречающиеся в записях
3. Все запросы с ошибками (код ответа - 4хх или 5хх)
4. Все уникальные IP, которые встречаются среди ошибочных запросов


## Part 6. **GoAccess**

Смотреть на результаты трудов в консоли конечно неплохо, но почему бы дополнительно не воспользоваться готовым решением, предоставляющим удобный интерфейс?

**== Задание ==**

С помощью утилиты GoAccess получить ту же информацию, что и в [Части 5](#part-5-мониторинг)

Открыть веб интерфейс утилиты на локальной машине.


## Part 7. **Prometheus** и **Grafana**

Практика с логами пока что окончена. Теперь пришло время мониторить состояние системы в целом.

**== Задание ==**

##### Установить и настроить **Prometheus** и **Grafana** на виртуальную машину
##### Получить доступ к веб интерфейсам **Prometheus** и **Grafana** с локальной машины

##### Добавить на дашборд **Grafana** отображение ЦПУ, доступной оперативной памяти, свободное место и кол-во операций ввода/вывода на жестком диске

##### Запустить ваш bash-скрипт из [Части 2](#part-2-засорение-файловой-системы)
##### Посмотреть на нагрузку жесткого диска (место на диске и операции чтения/записи)

##### Установить утилиту **stress** и запустить команду `stress -c 2 -i 1 -m 1 --vm-bytes 32M -t 10s`
##### Посмотреть на нагрузку жесткого диска, оперативной памяти и ЦПУ


## Part 8. Готовый дашборд

Собственно, зачем составлять собственный дашборд, если, как говорится, "всё уже украдено до нас"?
Почему бы не взять готовый дашборд, на котором есть все нужные метрики?

**== Задание ==**

##### Установить готовый дашборд *Node Exporter Quickstart and Dashboard* с официального сайта **Grafana Labs**

##### Провести те же тесты, что и в [Части 7](#part-7-prometheus-и-grafana)

##### Запустить ещё одну виртуальную машину, находящуюся в одной сети с текущей
##### Запустить тест нагрузки сети с помощью утилиты **iperf3**

##### Посмотреть на нагрузку сетевого интерфейса


## Part 9. Дополнительно. Свой *node_exporter*

Анализировать систему с помощью специальных утилит полезно и удобно, но Джону всегда хотелось понять, как же они работают.

**== Задание ==**

Написать bash-скрипт или программу на Си, которая собирает информацию по базовым метрикам системы (ЦПУ, оперативная память, жесткий диск (объем)).
Скрипт или программа должна формировать html страничку по формату **Prometheus**, которую будет отдавать **nginx**. \
Саму страничку обновлять можно как внутри bash-скрипта или программы (в цикле), так и при помощи утилиты cron, но не чаще, чем раз в 3 секунды.

##### Поменять конфигурационный файл **Prometheus**, чтобы он собирал информацию с созданной вами странички.

##### Провести те же тесты, что и в [Части 7](#part-7-prometheus-и-grafana)
